﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Media;

namespace SFJDManagement
{
	static class DataGridDevelop
	{
		/// <summary>
		/// 获取DataGrid控件单元格
		/// </summary>
		/// <param name="dataGrid">DataGrid控件</param>
		/// <param name="rowIndex">单元格所在的行号</param>
		/// <param name="columnIndex">单元格所在的列号</param>
		/// <returns>指定的单元格</returns>
		public static DataGridCell GetCell(this DataGrid dataGrid, int rowIndex, int columnIndex)
		{
			DataGridRow rowContainer = dataGrid.GetRow(rowIndex);
			if (rowContainer != null)
			{
				DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
                if(presenter == null)
                {
                    dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[columnIndex]);
                    presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
                }
				DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
				if (cell == null)
				{
					dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[columnIndex]);
					cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
				}
				return cell;
			}
			return null;
		}

		/// <summary>
		/// 获取DataGrid的行
		/// </summary>
		/// <param name="dataGrid">DataGrid控件</param>
		/// <param name="rowIndex">DataGrid行号</param>
		/// <returns>指定的行号</returns>
		public static DataGridRow GetRow(this DataGrid dataGrid, int rowIndex)
		{
			DataGridRow rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex);
			if (rowContainer == null)
			{
				dataGrid.UpdateLayout();
				dataGrid.ScrollIntoView(dataGrid.Items[rowIndex]);
				rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex);
			}
			return rowContainer;
		}

		/// <summary>
		/// 删除DataGrid的空行
		/// </summary>
		/// <param name="dataGrid">DataGrid控件</param>
		public static void RemoveEmptyRow(this DataGrid dataGrid)
		{
			for (int i = dataGrid.Items.Count - 1; i >= 0; i--)
			{
				DataGridRow rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(i);
				if (rowContainer == null)
				{
					dataGrid.UpdateLayout();
					dataGrid.ScrollIntoView(dataGrid.Items[i]);
					rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(i);
				}
				bool isEmpty = true;
				for (int j = dataGrid.Columns.Count - 1; j >= 0; j--)
				{
					if (rowContainer != null)
					{
						DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
						DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(j);
						if (cell == null)
						{
							dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[j]);
							cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(j);
						}
						System.Diagnostics.Debug.WriteLine("  aaa     " + cell.DataContext.GetType().Name);
						if (cell.DataContext.GetType().Name != "NamedObject")
						{
							isEmpty = false;
							break;
						}
					}
				}
				if (isEmpty)
				{
					System.Diagnostics.Debug.WriteLine("  bbb     " + i);
					dataGrid.Items.RemoveAt(i);
				}
			}
		}

		/// <summary>
		/// 获取父可视对象中第一个指定类型的子可视对象
		/// </summary>
		/// <typeparam name="T">可视对象类型</typeparam>
		/// <param name="parent">父可视对象</param>
		/// <returns>第一个指定类型的子可视对象</returns>
		public static T GetVisualChild<T>(Visual parent) where T : Visual
		{
			T child = default(T);
			int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
			for (int i = 0; i < numVisuals; i++)
			{
				Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
				child = v as T;
				if (child == null)
				{
					child = GetVisualChild<T>(v);
				}
				if (child != null)
				{
					break;
				}
			}
			return child;
		}
	}
}
